home *** CD-ROM | disk | FTP | other *** search
- #include <Types.h>
- #include <Events.h>
- #include <Fonts.h>
- #include <Menus.h>
- #include <Windows.h>
- #include <Dialogs.h>
- #include <Devices.h>
- #include <AERegistry.h>
- #include <AppleEvents.h>
- #include <AEDataModel.h>
- #include <stdio.h>
- #include <string.h>
-
- #define NOLIB "\pYou're trying to run a Mad Lib, aren't you?"
- #define YES "\pYes..."
- #define SHAME "\pI'm so ashamed."
-
- static AEEventHandlerUPP originaldlog;
-
- static OSErr dlog(const AppleEvent *ev, AppleEvent *reply, UInt32 refcon)
- {
- char buf[256] = "";
- unsigned long actualType;
- long actualSize;
-
- if (AESizeOfParam(ev, 'dtxt', &actualType, &actualSize) == noErr &&
- AEGetParamPtr(ev, keyDirectObject, typeText, &actualType, buf, sizeof(buf), &actualSize) == noErr)
- {
- buf[actualSize] = '\0';
-
- if (strstr(buf, "noun") || strstr(buf, "verb") || strstr(buf, "adjective")) {
- AppleEvent *evv = (AppleEvent *) ev;
-
- AEPutParamPtr(evv, keyDirectObject, typePString, NOLIB, StrLength(NOLIB)+1);
-
- // Button list
- {
- AEDescList btns;
- SInt32 dbtn = 2;
-
- AECreateList(NULL, 0, false, &btns);
- AEPutPtr(&btns, 0, typePString, YES, StrLength(YES)+1);
- AEPutPtr(&btns, 0, typePString, SHAME, StrLength(SHAME)+1);
- AEPutParamDesc(evv, 'btns', &btns);
- AEDisposeDesc(&btns);
- AEPutParamPtr(evv, 'dflt', typeSInt32, &dbtn, sizeof(dbtn));
- }
-
- CallAEEventHandlerProc(originaldlog, evv, reply, refcon);
- return errAEEventNotHandled;
- }
- }
-
- return CallAEEventHandlerProc(originaldlog, ev, reply, refcon);
- }
-
-
- static void Initialize()
- {
- MenuHandle m;
- AEEventHandlerUPP upp;
- SInt32 refcon;
-
- /* Initialize all the needed managers. */
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(NULL);
- InitCursor();
-
- m = GetMenu(128);
- if (m) {
- AppendResMenu(m, 'DRVR');
- InsertMenu(m, 0);
- }
-
- m = GetMenu(129);
- if (m)
- InsertMenu(m, NULL);
-
- DrawMenuBar();
-
-
- upp = NewAEEventHandlerProc(dlog);
- AEGetEventHandler('syso', 'dlog', &originaldlog, &refcon, true);
- AEInstallEventHandler('syso', 'dlog', upp, 0, true);
- }
-
- static void setitemtext(DialogPtr d, DialogItemIndex i, const char *s)
- {
- DialogItemType itemType;
- Handle item;
- Rect box;
-
- GetDialogItem(d, i, &itemType, &item, &box);
- setdialogitemtext(item, s);
- }
-
- static void UpdateDisplay(DialogPtr d, UInt32 sleep_time, UInt32 nulls, UInt32 interval)
- {
- static Boolean phase = false;
- float nps, est_nps;
- char s[256];
-
- sprintf(s, "%ld ticks%c", sleep_time, phase ? '.' : ' ');
- setitemtext(d, 3, s);
- phase = !phase;
-
- nps = (float) nulls * 60.0 / interval; // Null events per second.
- est_nps = 60.0 / sleep_time;
-
- if (sleep_time == 0)
- // sprintf(s, "%ld (%0.1f/sec)", nulls, nps);
- sprintf(s, "%0.1f/sec", nps);
- else
- // sprintf(s, "%ld (%0.1f/sec, %0.0f%%)", nulls, nps, (nps / est_nps) * 100.0);
- sprintf(s, "%0.1f/sec (%0.0f%%)", nps, (nps / est_nps) * 100.0);
- setitemtext(d, 4, s);
- }
-
- static Boolean DoMenuCommand(long cmd, UInt32 &sleep_time, Boolean &done)
- {
- short item = (cmd & 0x0FFFF);
-
- HiliteMenu(0);
- switch (cmd >> 16) {
- case 128: {
- Str255 name;
-
- GetMenuItemText(GetMenuHandle(128), item, name);
- OpenDeskAcc(name);
- return false;
- }
-
- case 129: {
- switch (item) {
- case 1: /* Sleep less */
- if (sleep_time > 0) {
- --sleep_time;
- return true;
- }
- else
- return false;
-
- case 2: /* Sleep more */
- ++sleep_time;
- return true;
-
- case 4: /* Quit */
- done = true;
- return false;
-
- default:
- return false;
- }
- break;
- }
- }
- return false;
- }
-
- void main()
- {
- DialogPtr d = NULL;
-
- Initialize();
-
- d = GetNewDialog(128, NULL, (WindowPtr) -1L);
-
- if (d) {
- UInt32 last_time, interval;
- UInt32 sleep_time = 1;
- UInt32 nulls = 0;
- Boolean done = false;
- EventRecord ev;
-
- last_time = TickCount();
-
- do {
- WaitNextEvent(everyEvent, &ev, sleep_time, NULL);
-
- interval = TickCount() - last_time;
-
- switch (ev.what) {
- case nullEvent:
- nulls++;
- break;
-
- case updateEvt:
- BeginUpdate(d);
- DrawDialog(d);
- EndUpdate(d);
- break;
-
- case mouseDown: {
- WindowPtr w;
-
- switch (FindWindow(ev.where, &w)) {
- case inGoAway:
- if (TrackGoAway(w, ev.where))
- done = true;
- break;
-
- case inMenuBar:
- if (DoMenuCommand(MenuSelect(ev.where), sleep_time, done))
- UpdateDisplay(d, sleep_time, nulls, interval);
- break;
-
- case inSysWindow:
- SystemClick(&ev, w);
- break;
-
- case inDrag: {
- Rect dragRect = (*GetGrayRgn())->rgnBBox;
- DragWindow(w, ev.where, &dragRect);
- break;
- }
-
- default:
- break;
- }
- break;
- }
-
- case keyDown:
- case autoKey:
- if (DoMenuCommand(MenuKey(ev.message & charCodeMask), sleep_time, done))
- UpdateDisplay(d, sleep_time, nulls, interval);
- break;
- }
-
- if (interval >= 60) {
- UpdateDisplay(d, sleep_time, nulls, interval);
- nulls = 0;
- last_time = TickCount();
- }
- } while (!done);
-
- DisposeDialog(d);
- }
-
- AEInstallEventHandler('syso', 'dlog', originaldlog, 0, true);
- }
-